Functies die zichzelf wijzigen
Scenario
Afhankelijk van welke gebruiker de website bezoekt moet de functie de mogelijkheden tonen van een admin of van een gewone bezoeker. We kunnen dit als volgt doen:
var user = 'Jef'; authorization = function() { if (user == 'Jef') { // hier schrijf je nuttiger dingen om te doen // maar dit is een voorbeeld return 'admin'; } else { return 'bezoeker'; } } console.log(user, ' is ', authorization());
Deze functie moet rekening houden met de mogelijkheid dat gebruikers met verschillende rechten de website bezoeken. We weten dat één keer de website geladen is, de bezoeker niet meer wijzigt. Toch wordt telkens als die methode wordt uitgevoerd nagekenen wie de bezoeker is. We kunnen dat vereenvoudigen en efficiënter maken door de functie zichzelf te laten wijzigen afhankelijk van wie de bezoeker is. En dat hoeft slechts eenmaal te gebeuren:
var user = 'Jef'; var authorizationSelfModified = function() { if (user == 'Jef') { // hier schrijf je nuttiger dingen om te doen // maar dit is een voorbeeld authorizationSelfModified = function() {return 'admin';}; } else { authorizationSelfModified = function() {return 'bezoeker';}; } }; // de eerste keer roep je die op om de functie // de wijzigen afhankelijk van wij aangemeld is console.log(user, ' is ', authorizationSelfModified()); console.log(user, ' is ', authorizationSelfModified());
See the Pen Zichzelf wijzigende functie by Jef Inghelbrecht (@jef) on CodePen.
Zichzelf wijzigende code
We beginnen met het declareren van een functie:
voorbeeld = function() { var tekst = 'eerste versie'; return tekst; }; console.log(voorbeeld());
Een functie is een object. Maar kunnen er een stringrepresentatie van maken met de toString
methode:
var tekst = voorbeeld.toString();
Vervolgens vervangen we de tekst 'eerste' door 'tweede':
var tekst2 = tekst.replace('eerste', 'tweede'); console.log(tekst2);
We maken een nieuw functie-object met de Function constructor. We knippen eerste de tekst function()
weg. Sommige browsers plaatsen een spatie tussen het keyword function
en de ronde haken. Dus we zorgen ervoor dat ook deze schrijfwijze verwijderd wordt:
voorbeeld2 = new Function(tekst2. replace("function()","") .replace("function ()","")); console.log(voorbeeld2());
Is dat iets wat je moet toepassen? Beter niet. Ik vermeld dat alleen om te tonen dat functions in JavaScript data zijn. Hieronder zien we een zinvoller manier om die mogelijkheid toe te passen.